// 给定两个整数，被除数 dividend 和除数 divisor。将两数相除，要求不使用乘法、除法和 mod 运算符。

// 返回被除数 dividend 除以除数 divisor 得到的商。

// 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
/**
 * @param {number} dividend
 * @param {number} divisor
 * @return {number}
 */
var divide = function(dividend, divisor) {
    // 边界条件判断
    if (dividend == 0) { return 0 }
    if (divisor == 1) { return dividend }
    let flag = 1;
    if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)) {
        flag = -1;
    }
    dividend = dividend > 0 ? dividend : -dividend;
    divisor = divisor > 0 ? divisor : -divisor;
    let res = div(dividend, divisor) > 2147483647 ? 2147483647 : div(dividend, divisor)
    return flag == 1 ? res : -res;

    function div(a, b) {
        if (a < b) { return 0 }
        let tab = b;
        let count = 1;
        // 以倍增的形式进行递归，每次将除数翻倍，得到的次数翻倍，当不满足条件时用剩余区间重新递归执行
        while ((tab + tab) <= a) {
            count = count + count;
            tab = tab + tab;
        }
        return count + div(a - tab, b)
    }
};